跳到主要内容

Linux 文件的搜索

通常 find 不很常用的!因为速度慢之外,也很耗费硬盘性能!一般我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻

因为 whereis 只找系统中某些特定目录下面的文件而已,locate 则是利用数据库来搜寻文件名,当然两者就相当的快速, 并且没有实际的搜寻硬盘内的文件系统状态

指令文件名的搜寻

寻找“可执行文件”

$ which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

搜寻 ifconfig 这个指令的完整文件名

$ which ifconfig
/sbin/ifconfig

找出 history 这个指令的完整文件名

$ which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin)

whereis 搜索特定文件

whereis 主要是针对 /bin /sbin 下面的可执行文件, 以及 /usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理。

$ whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件

可以使用 whereis -l 来看到底查找了哪些文件夹

使用示例:

找出 ifconfig 这个文件名

$ whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz

只找出跟 passwd 有关的“说明文档”文件名(man page)

$ whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man1/passwd.1ssl.gz /usr/share/man/man5/passwd.5.gz

locate 搜索 ⭐

这个需要先安装

sudo apt install mlocate

locate 是有个自带的数据索引库的搜索工具,所以它并不需要去遍历所有文件,直接根据 key 返回对象给用户(HashMap)

  • 优点:速度非常快
  • 缺点:更新不及时,所以刚创建的文件可能搜索不到,需要等它更新或者手动更新索引库:sudo updatedb

它主要有两台命令

  • updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件;
  • locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。
$ locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正则表达式的显示方式

使用示例:

找出系统中所有与 passwd 相关的文件名,且只列出 5 个

$ locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd

列出 locate 查询所使用的数据库文件之文件名与各数据数量

$ locate -S
Database /var/lib/mlocate/mlocate.db:
8,086 directories # 总纪录目录数
109,605 files # 总纪录文件数
5,190,295 Bytes in file names
2,349,150 Bytes used to store database

这个 locate 的使用更简单,直接在后面输入 “文件的部分名称” 后,就能够得到结果。

使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,但是就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天执行一次 (每个 distribution 都不同)

所以当你新创建起来的文件,却还在数据库更新之前搜寻该文件,那么 locate 会找不到

但是可以手动更新 locales

updatedb

updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间喔!

find 文件搜索

文件搜索(通配符:仅限于当前目录下的模糊查找)

语法:

find 搜索范围 搜索条件

使用参数

-name:接一个文件名(支持通配符) -iname:忽略大小写 -a:与 -o:或 -type:搜索类型 -type f:搜索文件 -type d:目录 -type l:链接文件(Link)

查找文件大小的单位

+ 大于

1b:1byte 1kb:1048b 1mb

使用示例:

# 注意:搜索不能带小数

# 列出当前目录及子目录下所有文件和文件夹
find .
# 精准搜索
find /home -name "test.txt"
# 模糊搜索
find /home -name "*.txt"
# 不区分大小写
find /home -iname "*.txt"

#==================根据普通的通配符进行匹配=====================
# 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)
# 或者
find . -name "*.txt" -o -name "*.pdf"
# 查找路径包含 local 的文件或者目录
find /usr/ -path "*local*"

#==================根据文件大小进行匹配=====================
# 根据文件大小搜索,1数据块=512字节Byte=0.5KB
find /home -size 100MB
# 大于100MB
find /home -size +100MB


#==================根据正则表达式进行匹配=====================
# 基于正则表达式匹配文件路径
find . -regex ".*\(\.txt\|\.pdf\)$"


#==================逻辑运算符================================
# 查找文件大小超过2k并且是普通文件类型的文件
find . -size +2k -a -type f

# 找出 /home 下不是以 .txt 结尾的文件
find . -not -name "*.txt"
# 或
find /home ! -name "*.txt"


#==================根据用户名搜索================================
find /home -user alsritter